/*
 * Representa una Entidad del tipo Centro de Comando
 * 
 * Recibe como paramteros 
 * _idCommandCenter: ID de la Entidad
 * _idOwner: ID del propietario de la Entidad
 * _isEnemy: Boolean que indica si la Entidad pertenece o no al jugador enemigo
 * 
 */
function CommandCenter(_idCommandCenter, _idOwner, _isEnemy){
	var MapModule = require('ti.map');
	
	var AnnotationType = require('ui/model/constants/AnnotationType');
	var CommnadCenterConstants = require('ui/model/constants/CommandCenterConstants');
		
	var _type;

	//Determina el Tipo en funcion si es o no enemigo	
	if (_isEnemy){
		_type = AnnotationType.ANNOTATION_ENEMY_COMMAND_CENTER;
	}	
	else {
		_type = AnnotationType.ANNOTATION_COMMAND_CENTER;
	}
		
	var self = {
		type: _type,
		enemy: _isEnemy,
		id: _idCommandCenter,
		idOwner: _idOwner,
		life: CommnadCenterConstants.INITIAL_LIFE_POINTS,
		
		view: null,
		
		latitude: null,
		longitude: null,
			
		//Metodos
		//Calcula la ruta para desplazarse
		calculateRoute: function(_currentLatitude, _currentLongitude, _newLatitude, _newLongitude){
								
			if (this.view != null){
				
				//Establece la ubicacion del origen y del destino de la ruta para ser calculada
				var _startLat = _currentLatitude;
				var _startLong = _currentLongitude;
				var _endLat = _newLatitude;
				var _endLong = _newLongitude;
			
				// The bellow URL is used to Get the route of current location to assigned destination Location.
				//URL para obtener los datos de la Ruta utilizando la API de Google 
				//origin= {latitud_inicio, longitud_inicio}
				//destination= {latitud_destino, longitud_destino}
				//sersor= {indica si la solicitud de indicaciones procede de un dispositivo con un sensor de ubicación. Este valor debe ser true o false.}
				//mode={determina el medio de transporte. El valor predeterminado es driving (auto) [driving  | walking  | bicycling  | transit ]}
 				var url = 'http://maps.googleapis.com/maps/api/directions/json?' + 
 						'origin=' + _startLat + ',' + _startLong + 
	  	  				'&destination=' + _endLat + ',' + _endLong + 
 						'&sensor=true' +
 						'&mode=' + TroopConstants.DISPLACEMENT_MODE;
			
				//Crear el HTTPClient
				var xhr = Titanium.Network.createHTTPClient();
				
				//Abre el request y especifica que el metodo es del tipo get y ademas que lo trate como sincronico
				xhr.open('GET', url, false);
				
				//Callback
				xhr.onload = function() {
					
					//Invoca el actionlistener
    				Ti.App.fireEvent('troop'+ self.id +'.GetPoints', {'responseText': this.responseText});
	    			
    			};	
			
				//El nombre del Action debe ser unico por cada objeto porque sino cuando lo invoca el callback
				//llama a todos los EventListener con el mismo nombre
				Ti.App.addEventListener('troop'+ self.id +'.GetPoints', function(data) {
	    			try{
  						//El Array "position" tiene los pasos desde la ubicación actual hasta el destino. Se utilizan dichos pasas para crear la ruta.
   						var position = JSON.parse(data.responseText).routes[0].legs[0].steps;
	 			    
		    			//Verifica si se el array contiene elementos que representan los pasos de la ruta 
		 				if (position[0] != null) {
			 				
	 						var routePoints = [];
			 				
	 						//Se agrega el punto de inicio de la ruta
							routePoints[routePoints.length] = {
									latitude: position[0].start_location.lat,
	    	    					longitude: position[0].start_location.lng
	        				};
	 
							//Se utiliza el bucle FOR para obtener todos los pasos y agregarlos al ARRAY, y utilizar este ARRAY para formar la ruta en android
	      					for (var i = 0; i < position.length; i++) {
			   					routePoints[routePoints.length] = {
										latitude : position[i].end_location.lat, 
    									longitude : position[i].end_location.lng
    							};
   							};
	    					
							//Agrega la ruta a la vista	
	   						self.view.addRoute(routePoints);
   							
   						} 
	   					else {
	    	   				alert('Google no encontro una ruta para la Tropa ' + self.id + '.');
   						}
   					}
					catch(e){
						alert('Error al calcular la ruta para la Tropa ' + self.id + '. Error: ' + e.message);
					}
				});	
						
				// Send the request to server
 				xhr.send();
			
				//Le indica a la vista que mueva la tropa en el mapa
 				this.view.move();
 			}
		},
		
		//Calcula la nueva posicion de la Tropa segun la ruta asignada
		move: function(_routePoints){
			
			if (this.view != null){ 
				
				//var step = TroopConstants.DISTANCE_MOVE;
			
				//Calcula la nueva ubicacion en la ruta en funcion del paso definido para la Tropa
				if(_routePoints.length != 0){

					//Verifica si el Jugador tiene puntos de accion para realizar el movimiento
					if (Ti.App.controller.player.actionPoints >= this.actionPointsCostMove){					
					
						//Latitud
						//Verifica si la latitud de la Tropa es igual a la latitud del primer punto de la ruta
						if (this.latitude != _routePoints[0].latitude){ 
					
							var distance = (_routePoints[0].latitude - this.latitude); //distancia entre la latitud del primer punto de la ruta y la latitud actual de la tropa 
							var _newLat;
				
				 			if (Math.abs(distance)> this.step){
								//A la latitud actual le suma el paso definido para el tipo de tropa
								//(distance/ Math.abs(distance)) : calcula el signo, pasa saber si se suma o resta el paso
								_newLat = this.latitude + (this.step * (distance/ Math.abs(distance)));
							}
							else{
								//Se llego a la nueva latitud
								_newLat = _routePoints[0].latitude;
							}
					
							//Actualiza la latitud				
							this.latitude = _newLat; //Objeto Tropa
							this.view.latitude = _newLat; //Vista						
						}
			
						//Longitud
						if (this.longitude != _routePoints[0].longitude){ 
							var distance = (_routePoints[0].longitude - this.longitude); //distancia entre la longitud del primer punto de la ruta y la longitud actual de la tropa
							var _newLong;
					
							if (Math.abs(distance)> this.step){
								//A la longitud actual le suma el paso definido para el tipo de tropa
								//(distance/ Math.abs(distance)) := calcula el signo, pasa saber si se suma o resta el paso
								_newLong = this.longitude + (this.step * (distance/ Math.abs(distance)));
							}
							else{
								//Se llego a la nueva longitud
								_newLong = _routePoints[0].longitude;
							}
					
							//Actualiza la longitud				
							this.longitude = _newLong; //Objeto Tropa
							this.view.longitude = _newLong; //Vista		
						}
				
						//Si se llego al primer punto de la ruta se lo elimina del listado
						if((this.latitude === _routePoints[0].latitude) && 
							(this.longitude === _routePoints[0].longitude)){
					
							//remueve el primer elemento del array
							//splice(index,howmanyRemove)
							_routePoints.splice(0,1);
							
							//Asigna los puntos pendientes de la ruta a la vista de la tropa
							this.view.routePoints = _routePoints;
						
							//Si la ruta no tiene maas puntos la elimina de la vista y la quita del mapa
							if (_routePoints.length == 0) {
								this.view.addRoute(_routePoints);
							}
						}
						
						//Resta los puntos de accion por el movimiento
						//Ti.App.controller.player.actionPoints = Ti.App.controller.player.actionPoints - this.actionPointsCostMove;
						
						Ti.App.controller.player.consumingActionPoints(this.actionPointsCostMove);
						
					}
				}
				else{
					//Reubica a la tropa en la ubicación actual 
					this.view.latitude = this.latitude;
					this.view.longitude = this.longitude;
				
					this.view.addRoute([]);
				}
				
				//Refresca los datos de la vista
				this.refreshView();
			}
		},
	
		//Establece la ubicacion
		setLocation: function(_lat, _long){
			
			if (this.view != null){
				
				this.view.newLatitude = _lat; 	
				this.view.newLongitude = _long;	
				this.view.currentLatitude = _lat;	
				this.view.currentLongitude = _long;
				this.view.latitude = _lat;		
				this.view.longitude = _long;
			}
			
			this.latitude = _lat;		
			this.longitude = _long;
			
			//Refresca los datos de la vista
			this.refreshView();
		},
	
		//Devuelve un string con los datos del estado del objeto
		getDetails: function(){
			if (this.enemy) {
				return 'Vida: ' + this.life;
			} else {
				return 'Vida: ' + this.life + '\nAtaque: ' + this.damageAttack + '\nDistancia Ataque: ' + this.distanceAttack;
			} 
		},
		
		//Refresca los datos de la vista
		refreshView: function(){
			if (this.view!=null){
					this.view.refresh();
			}
		}
	};
	
	return self;
};

module.exports = CommandCenter;